"""
类方法
    概述：
        属于类的方法，必须被 @classmethod 装饰器修饰，且形参列表的第一个参数必须是 类对象,一般用cls表示
    调用格式：
        类名.方法名()
        对象名.方法名()    # 可以 ，但是不推荐


静态方法
    概述：
        类似于类方法 ，也是属于类的，只不过对形参列表无强制要求，可以按需传入，用@staticmethod 修饰
    调用格式：
        类名.方法名
        对象名.方法名    # 可以，但不推荐

# 总结
    1. 类方法 和 静态方法的区别是： 在函数内部是否需要 用到类的引用， 如果需要用到，就定义成类方法
        否则就定义成静态方法，其他无任何区别
    2. 静态方法  和 类方法是优先于 对象存在的。所以 如果某个函数中不需要使用到self独享，就可以考虑
      将这个函数定义成  静态方法  或者  类方法
    3. 静态方法或者类方法 一般用于 优先于对象存在的资源  且 仅需要加载一次的资源
"""


class Student:
    # 类变量
    teacher_name = '王志刚'

    # 类方法
    @classmethod
    def speak(cls):
        print(f'我是一个学生，我的老师名字叫{cls.teacher_name}')

    # 静态方法
    @staticmethod
    def study():
       #  print(f'我是学生，我爱学习{teacher_name}') # 报错
        print(f'我是学生，我爱学习')

    # 成员方法
    def run(self):
        pass

if __name__ == '__main__':
    s1 = Student()

    # 调用类方法
    Student.speak()
    print('-'*20)

    s1.speak() # 语法正确，但是不推荐

    print('='*20)

    # 调用静态方法
    Student.study()
    s1.study() # 可以，但是不推荐